package com.coincalf.framework.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.MessageDigest;

/**
 * MD5加密算法实现。直接调用{@link #md5(String)}方法即可。
 *
 * project：pub-core
 *
 * $Author:Jeffy Chen
 * @version $Revision: 4582 $
 * @Modify $Date: 2015-06-30 19:36:58 +0800 (星期二, 30 六月 2015) $
 * @create time：2014-4-26 下午11:02:47
 *
 */
public class MD5Utils {

	/**日志管理*/
	private static final Logger logger = LoggerFactory.getLogger(MD5Utils.class);

	/**16进制字符*/
	private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
			"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

	/**
	 * 转换字节数组为16进制字串
	 *
	 * @param b
	 *            字节数组
	 * @return 16进制字串
	 */

	private static String byteArrayToHexString(byte[] b) {
		StringBuffer resultSb = new StringBuffer();
		for (int i = 0; i < b.length; i++) {
			resultSb.append(byteToHexString(b[i]));
		}
		return resultSb.toString();
	}

	/**
	 * 将byte数值转换为16进制字符串。
	 * @param b 一个byte数值。
	 * @return byte数值对应的16进制字符串。
	 */
	private static String byteToHexString(byte b) {
		int n = b;
		if (n < 0) {
			n = 256 + n;
		}
		int d1 = n / 16;
		int d2 = n % 16;
		return hexDigits[d1] + hexDigits[d2];
	}

	/**
	 * 将指定的字符串通过MD5加密，得到加密后的字符串。
	 * @param origin 原始字符串。
	 * @return 经过MD5加密后的字符串。
	 */
	public static String md5(String origin) {
		if( origin == null ) {
			return null;
		}
		String resultString = null;
		try {
			resultString = new String(origin);
			MessageDigest md = MessageDigest.getInstance("MD5");
			resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
		} catch (Exception ex) {
			logger.error(ex.getMessage());
		}
		return resultString;
	}

	/**
	 * 将指定的字符串多次MD5加密，得到加密后的字符串。
	 * @param origin 原始字符串。
	 * @param times 加密次数
	 * @return 经过多次MD5加密后的字符串。
	 */
	public static String md5(String origin,int times) {
		if( origin == null ) {
			return null;
		}
		String result = md5(origin);
		for (int i = 0; i < times - 1; i++) {
			result = md5(result);
		}
		return result;
	}

	/**
	 * 加密密码
	 * @param password 密码
	 * @return
	 */
	public static String md5Pwd(String password){
		return md5(password,2);
	}

	/**
	 * 校验密码是否相同
	 * @param pwd 密码
	 * @param pwdMD5 密码加密后的MD5
	 * @return 是否相同,相同为true,不想同为false
	 */
	public static boolean verifyPwd(String pwd, String pwdMD5) {
		return md5Pwd(pwd).equals(pwdMD5);
	}

	/**
	 * 测试代码
	 * @param args
	 */
	public static void main(String[] args) {
	    System.out.println(md5("admin"));
	    System.out.println(md5("admin",2));
	    System.out.println(md5Pwd("jianfeiok"));
	    System.out.println("77e2edcc9b40441200e31dc57dbb8829".length());
	  }


}
